package com.h.blog.common.unit;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.JwtParserBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.security.Key;
import java.util.Map;

/**
 * 使用 token 令牌技术可以处理集群的时候的一些问题
 */
@Slf4j
public class JwtUnits {
    // 这里的SECRET_StRING 是在test中测试生成得到，防止每次进行解析生成token的时候对应的签名进行变换，将其进行统一
    private static String SECRET_StRING = "IxVIzIpi/caGMpQ3+HV5ttBUb1Wh9Lxrpd5zdYQfM1E=";
    private static Key key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(SECRET_StRING));

    // 生成令牌
    public static String genToken(Map<String,Object> claims) {
        String compact = Jwts.builder()
                .setClaims(claims) // 自定义内容，也就是负载
                .signWith(key) // 设置签名
                .compact(); // 生成 token 令牌
        return compact;
    }

    // 校验令牌
    public static Claims parseToken(String token) {
        if(!StringUtils.hasLength(token)) {
            return null;
        }
        // 创建解析器，设置签名秘钥
        JwtParserBuilder jwtParserBuilder = Jwts.parserBuilder().setSigningKey(key);
        Claims claims = null;
        try{
            // 解析token，看能否解析出来，token的负载只要有一点不一样就会报错
            claims = jwtParserBuilder.build().parseClaimsJws(token).getBody();
        }catch (Exception e) {
            log.error("token校验失败，token" + token);
        }
        return claims;
    }
}
